package lesson

import (
	"fmt"
	"sort"
)

func Lesson08() {
	fmt.Println("package lesson file lesson/lesson08.go function Lesson08")

	// map的初始化类型
	// 只声明，无法使用赋值
	var map01 map[int]string
	fmt.Println("[map01]:", map01)

	map02 := map[int]string{}
	fmt.Println("[map02]:", map02)

	map03 := make(map[int]string)
	fmt.Println("[map03]:", map03)

	var map04 map[int]string = make(map[int]string)
	fmt.Println("[map04]:", map04)

	// map的赋值
	map04[1] = "abc"
	fmt.Println("[map04]:", map04)
	value01 := map04[1]
	fmt.Println("[value]:", value01)
	// 删除map的键值对
	delete(map04, 1)
	fmt.Println("[map04]:", map04)

	// 只初始化了最外层的map，而里面的map并没有初始化
	var map05 map[int]map[int]string = make(map[int]map[int]string)
	// 对里层map进行初始化
	map05[1] = make(map[int]string)
	map05[1][1] = "OK"
	// panic: assignment to entry in nil map
	//map05[2][1] = "OK"
	fmt.Println("[map05]:", map05)

	// 多返回值确定
	value02, exist := map05[2][1]
	if exist == true {
		fmt.Println("[exist]:", exist)
		fmt.Println("[value01]:", value02)
	} else {
		fmt.Println("[exist]:", exist)
	}

	// 迭代
	for key, value := range map05 {
		fmt.Println("[key]:", key, " [value]:", value)
	}

	// 修改迭代的对象本身
	for key, value := range map05 {
		fmt.Println("[key]:", key, " [value]:", value)
		map05[i] = map04
	}

	// 查看迭代的结果
	for key, value := range map05 {
		fmt.Println("[key]:", key, " [value]:", value)
	}

	// 初始化slicemap
	slicemap := make([]map[int]string, 5)
	for index, value := range slicemap {
		//value = make(map[int]string, 1)
		//value[1] = "OK" // 无法初始化

		slicemap[index] = make(map[int]string, 1)
		slicemap[index][1] = "OK"

		fmt.Println("[index]:", index, " [value]:", value)
	}

	fmt.Println("[slicemap]:", slicemap)

	// map间接排序
	// 由于map本身是无须的，则只能对key进行间接排序
	map06 := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e"}

	// 注意：这里多次运行输出结果不同
	for key, value := range map06 {
		fmt.Println("[key]:", key, " [value]:", value)
	}

	slice := make([]int, len(map06))

	index := 0
	for key, value := range map06 {
		fmt.Println("[key]:", key, " [value]:", value)
		// 存储到slice当中
		slice[index] = key
		index++
	}
	sort.Ints(slice)
	// 固定
	for index, value := range slice {
		fmt.Println("[index]:", index, " [value]:", value, " [map.value]", map06[value])
	}

	// homework
	map07 := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e", 6: "f"}
	fmt.Println(map07)

	map08 := map[string]int{}

	for key, value := range map07 {
		map08[value] = key
	}

	fmt.Println(map08)
}
